import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    userList: [],
    currentChat: {
      type: 1, // 默认为群聊
      targetId: null,
      targetName: '群聊室'
    },
    messages: {
      group: [], // 群聊消息
      private: {} // 私聊消息, 格式: { userId: [messages] }
    },
    newMessageNotification: {
      group: false,
      private: {} // 格式: { userId: boolean }
    }
  },
  
  mutations: {
    SET_USER(state, user) {
      state.user = user
    },
    
    SET_USER_LIST(state, userList) {
      state.userList = userList
    },
    
    SET_CURRENT_CHAT(state, { type, targetId, targetName }) {
      state.currentChat.type = type
      state.currentChat.targetId = targetId
      state.currentChat.targetName = targetName
      
      // 清除对应的通知
      if (type === 1) {
        state.newMessageNotification.group = false
      } else if (type === 0 && targetId) {
        Vue.set(state.newMessageNotification.private, targetId, false)
      }
    },
    
    ADD_MESSAGE(state, message) {
      // 如果用户未登录，不处理消息
      if (!state.user) {
        console.warn('用户未登录，消息将不会被处理');
        return;
      }
      
      if (message.chatType === 1) {
        // 群聊消息
        state.messages.group.push(message)
        
        // 如果当前不在群聊界面，显示通知
        if (state.currentChat.type !== 1) {
          state.newMessageNotification.group = true
          // 播放声音和闪烁图标在websocket.js中处理
        }
      } else {
        // 私聊消息
        const otherUserId = message.senderId === state.user.id ? message.receiverId : message.senderId
        
        if (!state.messages.private[otherUserId]) {
          Vue.set(state.messages.private, otherUserId, [])
        }
        
        state.messages.private[otherUserId].push(message)
        
        // 如果当前不在和该用户的聊天界面，显示通知
        if (state.currentChat.type !== 0 || state.currentChat.targetId !== otherUserId) {
          Vue.set(state.newMessageNotification.private, otherUserId, true)
          // 播放声音和闪烁图标在websocket.js中处理
        }
      }
    },
    
    SET_GROUP_MESSAGES(state, messages) {
      state.messages.group = messages
    },
    
    SET_PRIVATE_MESSAGES(state, { userId, messages }) {
      Vue.set(state.messages.private, userId, messages)
    },
    
    UPDATE_USER_STATUS(state, { userId, online }) {
      const user = state.userList.find(u => u.id === userId)
      if (user) {
        user.online = online
      } else {
        // 如果用户不在列表中，可能是新用户，应该触发完整用户列表更新
        console.warn(`用户(ID: ${userId})不在列表中，需要更新完整用户列表`)
        
        // 请求更新用户列表的操作将通过websocket.js中的updateUserList函数处理
        if (Vue.prototype.$updateUserList) {
          Vue.prototype.$updateUserList()
        }
      }
    }
  },
  
  actions: {
    login({ commit }, user) {
      commit('SET_USER', user)
    },
    
    logout({ commit }) {
      commit('SET_USER', null)
      commit('SET_USER_LIST', [])
      commit('SET_GROUP_MESSAGES', [])
      
      // 清空私聊消息
      commit('SET_CURRENT_CHAT', {
        type: 1,
        targetId: null,
        targetName: '群聊室'
      })
      
      // 断开WebSocket连接
      if (Vue.prototype.$websocket && Vue.prototype.$websocket.close) {
        Vue.prototype.$websocket.close()
      }
      
      // 清除本地存储
      localStorage.removeItem('userId')
      localStorage.removeItem('username')
    },
    
    updateUserList({ commit }, userList) {
      commit('SET_USER_LIST', userList)
    },
    
    addMessage({ commit }, message) {
      commit('ADD_MESSAGE', message)
    },
    
    updateUserStatus({ commit }, { userId, online }) {
      commit('UPDATE_USER_STATUS', { userId, online })
    }
  }
}) 